package com.leyou.trade.service.impl;

import com.leyou.auth.local.UserContext;
import com.leyou.trade.entity.CartItem;
import com.leyou.trade.repository.CartItemRepository;
import com.leyou.trade.service.CartItemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

@Service
public class CartItemServiceImpl implements CartItemService {

    @Autowired
    private CartItemRepository repository;

    @Autowired
    private MongoTemplate mongoTemplate;

    @Override
    public void saveCartItem(CartItem cartItem) {
        //获取用户id
        Long userId = UserContext.getUser().getId();
        //抽取方法
        cartItem = handlerSaveCartItem(cartItem, userId);
        //添加
        repository.save(cartItem);
    }

    private CartItem handlerSaveCartItem(CartItem cartItem, Long userId) {
        //获取商品id
        String id = CartItem.createId(userId, cartItem.getSkuId());
        //查询商品信息
        Optional<CartItem> optional = repository.findById(id);
        //判断购物车中是否有该商品
        if (optional.isPresent()) {
            //获取需要买的数量
            Integer num = cartItem.getNum();
            //说明购物车中已经放了该商品,获取商品信息,覆盖要加入购物车的商品信息
            cartItem = optional.get();
            //修改数量
            cartItem.setNum(cartItem.getNum() + num);
//            //设置新的时间，写入
//            cartItem.setUpdateTime(new Date());
//            repository.save(cartItem);
        } else {
            //购物车中没有，直接写入
            //设置id，时间
            cartItem.setId(id);
            cartItem.setUserId(userId);
//            cartItem.setUpdateTime(new Date());
//            repository.save(cartItem);
        }
        //设置新的时间，写入
        cartItem.setUpdateTime(new Date());
        return cartItem;
    }

    @Override
    public List<CartItem> queryCartList() {
        //获取用户id
        Long userId = UserContext.getUser().getId();
        //自定义一个方法，查询
        List<CartItem> list = repository.findByUserId(userId);
        return list;
    }

    @Override
    public void updateCart(Long skuId, Integer num) {
        //获取用户id
        Long userId = UserContext.getUser().getId();
        //获取商品id
        String id = CartItem.createId(userId, skuId);
        //调用方法
        mongoTemplate.update(CartItem.class)
                //匹配商品id
                .matching(Query.query(Criteria.where("_id").is(id)))
                //设置新的num
                .apply(Update.update("num", num))
                //修改第一个
                .first();
    }

    @Override
    public void deleteBySkuId(Long skuId) {
        //获取用户id
        Long userId = UserContext.getUser().getId();
        //获取商品id
        String id = CartItem.createId(userId, skuId);
        //删除
        repository.deleteById(id);
    }

    @Override
    public void addCartList(List<CartItem> list) {
        //获取用户id
        Long userId = UserContext.getUser().getId();
        //用流来调用方法
        List<CartItem> cartItemList = list.stream().map(cartItem -> handlerSaveCartItem(cartItem, userId)).collect(Collectors.toList());
        //添加
        repository.saveAll(cartItemList);
    }
}
